
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
 */
package objects;

//~--- non-JDK imports --------------------------------------------------------

import org.jmatrices.dbl.Matrix;
import org.jmatrices.dbl.MatrixFactory;

//~--- JDK imports ------------------------------------------------------------

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 *
 * @author lab18204
 */
public class Proyecto {
    private static final double  CERO                 = 0.0d;
    private static final int     NUMERO_RESTRICCIONES = 3;
    private static final double  UNO                  = 1.0d;
    private List<Actividad>      actividadesProyecto;
    private RutaAlterna          alterna;
    private int                  duracionProyecto;
    private Actividad            finalFicticia;
    private Actividad            inicialFicticia;
    private List<Actividad>      listaUtilitariaRecursion;
    private Matrix               matrizPrecedenciasIndirectas;    // Matriz binaria(true|false),
    private int                  max;
    private int                  recurso_1_Constraint;
    private int                  recurso_2_Constraint;
    private int                  recurso_3_Constraint;
    private int[]                restriccionesArray;
    private String               rutaAlterna;
    private ArrayList<Actividad> rutaCr;
    private String               rutaCritica;
    private int                  sumatoriaRestricciones;

    public Proyecto() {
        rutaCritica              = new String();
        rutaAlterna              = new String();
        duracionProyecto         = -1;
        actividadesProyecto      = new ArrayList<Actividad>();
        rutaCr                   = new ArrayList<Actividad>();
        alterna                  = new RutaAlterna(this);
        restriccionesArray       = new int[NUMERO_RESTRICCIONES];
        listaUtilitariaRecursion = new ArrayList<Actividad>();
    }

    public void determinarPrecedenciasIndirectas() {
        int ordenMatriz = this.getActividadesProyecto().size() - 2;    // Cantidad de actividades menos las 2 ficticias.
        matrizPrecedenciasIndirectas = MatrixFactory.getScalarMatrix(ordenMatriz, null,CERO);
        for(Actividad actInicial : this.inicialFicticia.getSucesoras()){
            listaUtilitariaRecursion.clear();
            crearMatrizPrecedencias(actInicial);
        }

    }

    private void crearMatrizPrecedencias(Actividad a) {
        if ((a.getSucesoras() == null) || (a.getSucesoras().size() > 0) || a.isEsFicticia()) {
            return;
        } else {
            getListaUtilitariaRecursion().add(a);
            for (Actividad sucesor : a.getSucesoras()) {
               if(!sucesor.isEsFicticia())
                    establecerPrecedencia(sucesor, getListaUtilitariaRecursion());

               crearMatrizPrecedencias(sucesor);
            }
        }
    }

    private void establecerPrecedencia(Actividad a, List<Actividad> actLista) {
        for (Actividad actividad : actLista) {
            matrizPrecedenciasIndirectas.set(a.getNumeroActividad(), actividad.getNumeroActividad(), UNO);
            matrizPrecedenciasIndirectas.set(actividad.getNumeroActividad(), a.getNumeroActividad(), UNO);
        }
    }


    public RutaAlterna getAlterna() {
        return alterna;
    }

    public void setAlterna(RutaAlterna alterna) {
        this.alterna = alterna;
    }

    public String getRutaAlterna() {
        return rutaAlterna;
    }

    public void setRutaAlterna(String rutaAlterna) {
        this.rutaAlterna = rutaAlterna;
    }

    public Actividad getFinalFicticia() {
        return finalFicticia;
    }

    public ArrayList<Actividad> getRutaCr() {
        return rutaCr;
    }

    public void setRutaCr(ArrayList<Actividad> rutaCr) {
        this.rutaCr = rutaCr;
    }

    public void setFinalFicticia(Actividad finalFicticia) {
        this.finalFicticia = finalFicticia;
    }

    public Actividad getInicialFicticia() {
        return inicialFicticia;
    }

    public void setInicialFicticia(Actividad inicialFicticia) {
        this.inicialFicticia = inicialFicticia;
    }

    public List<Actividad> getActividadesProyecto() {
        return actividadesProyecto;
    }

    public void setActividadesProyecto(ArrayList<Actividad> actividadesProyecto) {
        this.actividadesProyecto = actividadesProyecto;
    }

    public int getSumatoriaRestricciones() {
        return sumatoriaRestricciones;
    }

    public void setSumatoriaRestricciones(int sumatoriaRestricciones) {
        this.sumatoriaRestricciones = sumatoriaRestricciones;
    }

    public int getDuracionProyecto() {
        return duracionProyecto;
    }

    public void setDuracionProyecto(int duracionProyecto) {
        this.duracionProyecto = duracionProyecto;
    }

    public String getRutaCritica() {
        return rutaCritica;
    }

    public void setRutaCritica(String rutaCritica) {
        this.rutaCritica = rutaCritica;
    }

    public int getMax() {
        return max;
    }

    public void setMax(int max) {
        this.max         = max;
        duracionProyecto = max;
    }

    /**
     * @return the recurso_1_Constraint
     */
    public int getRecurso_1_Constraint() {
        return recurso_1_Constraint;
    }

    /**
     * @param recurso_1_Constraint the recurso_1_Constraint to set
     */
    public void setRecurso_1_Constraint(int recurso_1_Constraint) {
        restriccionesArray[0]     = recurso_1_Constraint;
        this.recurso_1_Constraint = recurso_1_Constraint;
    }

    /**
     * @return the recurso_2_Constraint
     */
    public int getRecurso_2_Constraint() {
        return recurso_2_Constraint;
    }

    /**
     * @param recurso_2_Constraint the recurso_2_Constraint to set
     */
    public void setRecurso_2_Constraint(int recurso_2_Constraint) {
        restriccionesArray[1]     = recurso_2_Constraint;
        this.recurso_2_Constraint = recurso_2_Constraint;
    }

    /**
     * @return the recurso_3_Constraint
     */
    public int getRecurso_3_Constraint() {
        return recurso_3_Constraint;
    }

    /**
     * @param recurso_3_Constraint the recurso_3_Constraint to set
     */
    public void setRecurso_3_Constraint(int recurso_3_Constraint) {
        restriccionesArray[2]     = recurso_3_Constraint;
        this.recurso_3_Constraint = recurso_3_Constraint;
    }

    /**
     * @return the restriccionesArray
     */
    public int[] getRestriccionesArray() {
        return restriccionesArray;
    }

    /**
     * @return the listaUtilitariaRecursion
     */
    public List<Actividad> getListaUtilitariaRecursion() {
        return listaUtilitariaRecursion;
    }
}
